//#include "SDL/SDL_image.h"
#include  "../common/SDL/include/SDL_ttf.h"       // INCLUSION DE LIBRERIA TTF PARA MANEJAR FONTS
#include <string>

//RESOLUCION DE PRUEBA
const int anchoPantalla = 1000;
const int altoPantalla = 500;
const int bppPantalla = 32;

//INICIAZLICACION DE VARIABLES

//FONDO
SDL_Surface *fondo = NULL;

SDL_Surface *screen = NULL;

//INICIZLIZO FONT
TTF_Font *font = NULL;

//VARIABLES PARA CONTROLAR TOQUES DE TECLA
SDL_Event eventoSalir;
SDL_Event eventoComenzarJuego;
SDL_Event eventoFinJuego;

//SETEO EL COLOR DE LAS LETRAS PARA EL FONT
SDL_Color textoColor = { 255, 255, 200 };

////////////////////*

//The surfaces that will be used
SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
//SDL_Surface *screen = NULL;

SDL_Surface *load_image( std::string filename )
{
    //Temporary storage for the image that's loaded
    SDL_Surface* loadedImage = NULL;

    //The optimized image that will be used
    SDL_Surface* optimizedImage = NULL;

    //Load the image
    loadedImage = SDL_LoadBMP( filename.c_str() );

    //If nothing went wrong in loading the image
    if( loadedImage != NULL )
    {
        //Create an optimized image
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //Free the old image
        SDL_FreeSurface( loadedImage );
    }

    //Return the optimized image
    return optimizedImage;
}


void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )
{
    //Make a temporary rectangle to hold the offsets
    SDL_Rect offset;

    //Give the offsets to the rectangle
    offset.x = x;
    offset.y = y;

    //Blit the surface
    SDL_BlitSurface( source, NULL, destination, &offset );
}


/////////////*

//METODO QUE INVOCA A SDL PARA TTF: BLITSURFACES
void realizarSuperficie( int x, int y, SDL_Surface* origen, SDL_Surface* destino, SDL_Rect* rect = NULL )
{
	//DESPLAZAMIENTO
    SDL_Rect despl;

    despl.x = x;
    despl.y = y;

    SDL_BlitSurface( origen, rect, destino, &despl );
}

bool inicializar()
{
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return false;
    }

    //PANTALLA
    screen = SDL_SetVideoMode( anchoPantalla, altoPantalla, bppPantalla, SDL_SWSURFACE );

    //SI HUBO ERROR
    if( screen == NULL )
    {
        return false;
    }

    //INICIALIZO TTF PARA ESCRIBIR
    if( TTF_Init() == -1 )
    {
        return false;
    }

    //SETEO NOMBRE DE PANTALLA
    SDL_WM_SetCaption( "TP Tejo", NULL );

    return true;
}


//CARGO LA IMAGEN DE FONDO, QUE SERIAN LOS PASAJES DE NIVEL
SDL_Surface *cargarImagen( std::string archivo )
{
    //IMAGEN CARGADO
    SDL_Surface* imagen = NULL;

    //SUPERFICIE OPTIMIZADO PARA USAR
    SDL_Surface* imagenOptim = NULL;

    //CARGO IMAGEN
  //  imagen = IMG_Load( archivo.c_str() );

    //SI LA IMAGEN FUE CARGADO
    if( imagen != NULL )
    {
        //INICIO OPTIMIZADOR DE IMAGEN
    	imagenOptim = SDL_DisplayFormat( imagen );

        //LIBERO IMAGENES VIEJAS
        SDL_FreeSurface( imagen );

        //SI FUE OPTIMIZADO LA IMAGEN
        if( imagenOptim != NULL )
        {
            //COLOR PANTALLA
            SDL_SetColorKey( imagenOptim, SDL_SRCCOLORKEY, SDL_MapRGB( imagenOptim->format, 0, 0xFF, 0xFF ) );
        }
    }
    return imagenOptim;
}


//FUNCION CARGAR IMAGEN
bool archivoFont()
{
    //CARGO IMAGEN
	fondo = cargarImagen("gameOver.bmp");   //FONDO

    //ABRO EL FONT
    font = TTF_OpenFont( "lazy.ttf", 20 );    //levanto el tipo de letra y sete tamanio letra

    //SI HUBO ERROR CON EL FONDO
    if( fondo == NULL )
    {
        return false;
    }

    //SI HUBO ERROR CON EL FONT
    if( font == NULL )
    {
        return false;
    }
	
    return true;
	
}



//CIERRO, EN ESPECIAL AL FONT
void LimpiarFont()
{
    //CIERRRO FONDO
    SDL_FreeSurface( fondo );

    //CIERRO FONT
    TTF_CloseFont( font );

    //SALIR DEL TTF
    TTF_Quit();

    //SALIR DEL SDL
    SDL_Quit();
}

int mostrarPantallaInicial(SDL_Surface* screen)
{
	//DECLARACION DE VARIABLES
	SDL_Surface * fontJugar = NULL;
	SDL_Surface * fontSalir = NULL;
	SDL_Surface * fontPresentacion = NULL;

   //INICIALIZO A TODOS: TTF, VIDEO,ETC
	/*if( inicializar() == false )
							    {
							        return 1;
							    }
*/

   //CARGO UN FONDO PARA MOSTRAR TTF

	( TTF_Init() == -1 );
   if( archivoFont() == false )
   {
       return 1;
   }
   //ABRO UN FORMATO DE FONT PARA MOSTRAR PUNTAJE,VIDA,NIVEL, BUSCAR AFUERA DEL SRC
   font = TTF_OpenFont("Simpsonfont.ttf ", 20);

   /* !!!INCREMENTO POR CHOQUE,puntajePorLadrillo TIENE EL VALOR A MOSTRAR PUNTAJE EN PANTALLA
    * SUMO UNO AL MISMO SI LO ROMPE
    */

   //ABRO OTRO FORMATO DE FONT PARA MOSTRAR PANTALLA JUGANDO
   SDL_Color textoColor = { 200, 50, 100 };
   font = TTF_OpenFont( "Simpsonfont2.ttf", 50 );
   fontPresentacion = TTF_RenderText_Solid(font,"ARKANOID: GRUPO 2",textoColor);

   SDL_Color textoColor2 = { 100, 50, 20 };
   font = TTF_OpenFont("Simpsonfont.ttf ", 30);
   fontJugar = TTF_RenderText_Solid(font,"INICIAR JUEGO: Presione 1",textoColor2);

   fontSalir = TTF_RenderText_Solid(font,"SALIR DEL JUEGO: Presione 2",textoColor2);

   //UBICO EL FONDO
   realizarSuperficie( 0, 0, fondo, screen );

   //UBICO PUNTAJE,VIDA Y NIVEL SETEADO ARRIBA
   realizarSuperficie( 80, 50, fontPresentacion, screen );
   realizarSuperficie( 50, 160, fontJugar, screen );
   realizarSuperficie( 50, 200, fontSalir, screen );

   //ACTUALIZO screen
   if( SDL_Flip( screen ) == -1 )
    {
	 return 1;
    }

   return 0;
}

void limpiarPantallaPuntaje(SDL_Surface* screen)

{
	( TTF_Init() == -1 );

	//DECLARACION DE VARIABLES
	char texto[80];
	SDL_Surface * fontPuntaje = NULL;

	font = TTF_OpenFont( "Simpsonfont2.ttf", 18 );

	int puntajePorLadrillo=0;
	SDL_Color textoColor2 = { 0, 0, 0 };
	sprintf (texto, "",puntajePorLadrillo);
	fontPuntaje = TTF_RenderText_Solid(font,texto,textoColor2);
	realizarSuperficie( 0, 0, fontPuntaje, screen );

}


void mostrarPantallaJugando(SDL_Surface* screen,int puntaje,int vidas,int nivel)
{
	( TTF_Init() == -1 );

	//DECLARACION DE VARIABLES
	char texto[80];
	SDL_Surface * fontPuntaje = NULL;
	SDL_Surface * fontVida = NULL;
	SDL_Surface * fontNivel = NULL;

	font = TTF_OpenFont( "Simpsonfont2.ttf", 30 );

	SDL_Color textoColor2 = { 150, 110, 120 };
	sprintf (texto, "Player1 :%d",puntaje);
	fontPuntaje = TTF_RenderText_Solid(font,texto,textoColor2);

	//!!!DECREMENTO POR PERDIDA DE VIDA, TIENE EL VALOR A MOSTRAR EN VIDA EN PANTALLA
	//RESTO UNO A VIDAS SI CAE DEBAJO DEL ELIPSE

	sprintf (texto, "Player2 :%d",vidas);
	fontVida = TTF_RenderText_Solid(font,texto,textoColor);


	//!!!INCREMENTO POR PASAR DE NIVEL,TIENE VALOR A MOSTRAR NIVEL EN PANTALLA
	//SUMO UNO A NIVEL SI ROMPE TODOS LOS LADRILLOS

//	sprintf (texto, "Nivel:%d",nivel);
//	fontNivel = TTF_RenderText_Solid(font,texto,textoColor);


	realizarSuperficie( 150, 0, fontPuntaje, screen );
	realizarSuperficie( 700, 0, fontVida, screen );
	SDL_FreeSurface(fontPuntaje);
	SDL_FreeSurface(fontVida);
	TTF_CloseFont(font);

	SDL_Flip(screen);
}



void mostrarPantallaFin(SDL_Surface* screen, bool ganoJugador1)
{

	( TTF_Init() == -1 );
	std::string ganador = ganoJugador1 ? "Jugador 1" : "Jugador 2";

	
	//int SDL_FillRect(SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);
	Uint32 colorFondo = SDL_MapRGB(screen->format, 0, 0, 0);

	SDL_Rect rect;
	rect.h = 500;
	rect.w = 1000;
	rect.x = 0;
	rect.y = 0;

	SDL_FillRect(screen,&rect,colorFondo);

	//DECLARACION DE VARIABLES
	SDL_Surface * fontFin = NULL;
	SDL_Surface * fontFin2 = NULL;

	//inicializar();
	SDL_Color textoColor = { 255, 217, 15 };
	font = TTF_OpenFont( "Simpsonfont2.ttf", 40 );

	std::string frase = "Ha ganado el " + ganador;
	char texto[80];
	strcpy(texto,frase.c_str());


	char texto2[10]; 
	std::string frase2 = "The End";
	strcpy(texto2,frase2.c_str());

	fontFin = TTF_RenderText_Solid(font,texto,textoColor);

	fontFin2 = TTF_RenderText_Solid(font,texto2,textoColor);

	realizarSuperficie( 250, 200, fontFin, screen );

	realizarSuperficie( 250, 100, fontFin2, screen );

	TTF_CloseFont(font);
	SDL_FreeSurface(fontFin);
	SDL_FreeSurface(fontFin2);
	SDL_Flip(screen);

}

void mostrarPantallaLoading(SDL_Surface* screen) {
	TTF_Init();
	
	//pinto de negro la pantalla
	Uint32 colorFondo = SDL_MapRGB(screen->format, 0, 0, 0);
	SDL_Rect rect;
	rect.h = 500;
	rect.w = 1000;
	rect.x = 0;
	rect.y = 0;
	SDL_FillRect(screen,&rect,colorFondo);

	SDL_Surface * fontLoading = NULL;
	
	SDL_Color textoColor = { 255, 217, 15 };
	font = TTF_OpenFont( "Simpsonfont2.ttf", 40 );

	std::string frase = "Espere un momento por favor...";
	char texto[80];
	strcpy(texto,frase.c_str());


	fontLoading = TTF_RenderText_Solid(font,texto,textoColor);

	realizarSuperficie( 200, 200, fontLoading, screen );

	

	TTF_CloseFont(font);
	SDL_FreeSurface(fontLoading);
	
	SDL_Flip(screen);

}
